package vip.ifmm.lehouse.user.service.api.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.remoting.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import vip.ifmm.lehouse.common.dto.ServerResponse;
import vip.ifmm.lehouse.common.enums.status.UserInfoStatus;
import vip.ifmm.lehouse.common.model.User;
import vip.ifmm.lehouse.user.service.api.UserInfoService;
import vip.ifmm.lehouse.user.service.dao.UserInfoDao;
import vip.ifmm.lehouse.user.service.utils.RedisUtil;
import vip.ifmm.lehouse.user.service.utils.SessionUtil;

import javax.annotation.Resource;
import java.util.Date;

/**
 * @author: mackyhuang
 * <p>email: mackyhuang@163.com <p>
 * <p>date: 2019/6/16 </p>
 */

@Service(owner = "mackyhuang",
    mock = "vip.ifmm.lehouse.user.service.api.mock.UserInfoServiceMock")
public class UserInfoServiceImpl implements UserInfoService {

    @Resource
    private UserInfoDao userInfoDao;

    /**
     * 通过用户主键id获取用户信息
     * @param userId 用户主键id
     * @return User 对象
     */
    @Override
    public ServerResponse getUserInfo(Integer userId) {
        if (userId == null){
            return ServerResponse.response(UserInfoStatus.USER_ID_EMPTY);
        }
        User user = userInfoDao.getUserByUserId(userId);
        return ServerResponse.response(UserInfoStatus.USER_INFO_GET, user);
    }

    /**
     * 提供用户数据更新
     * 外部接口可以使用，更新用户一般性数据，例如 性别、生日此类可直接操作数据
     * 内部也调用其完成复杂的用户数据更新，如头像更新
     * @param user 用户数据
     * @return 更新
     */
    @Override
    public ServerResponse updateUserInfo(User user) {
        if (user.getUserId() == null){
            return ServerResponse.response(UserInfoStatus.USER_ID_EMPTY);
        }
        user.setUserUpdateTime(new Date());
        int result = userInfoDao.updateUser(user);
        if (result <= 0){
            return ServerResponse.response(UserInfoStatus.UPDATE_FAILURE);
        }
        //因此方法用于内外部更新，导致user内数据不全，所以不能直接用提交上来的对象更新session，需要去数据库取最新的
        User curUser = (User)getUserInfo(user.getUserId()).getData();
        //redis 做 session， 更新session中的用户token
        SessionUtil.putSession(SessionUtil.getSessionBo(curUser));
        return ServerResponse.response(UserInfoStatus.UPDATE_SUCCESS);
    }

    /**
     * 提供给予外部接口在更新用户昵称时检查 当前用户名是否可用
     * @param nickname 需要验证的昵称
     * @return 昵称是否可用
     */
    @Override
    public ServerResponse nicknameExisted(String nickname) {
        int match = userInfoDao.nicknameExisted(nickname);
        if (match <= 0){
            return ServerResponse.response(UserInfoStatus.NICKNAME_CHECK_SUCCESS);
        } else {
            return ServerResponse.response(UserInfoStatus.NICKNAME_CHECK_FAILURE);
        }
    }

    /**
     * 提供用户上传头像功能的连接存储功能
     * 前端上传用户id和用户头像的链接，这里调用updateUserInfo方法更新
     * @param user 内含 用户id和用户头像链接
     * @return 更新结果
     */
    @Override
    public ServerResponse updateHeadImage(User user){
        if (user.getUserId() == null){
            return ServerResponse.response(UserInfoStatus.USER_ID_EMPTY);
        }
        if (StringUtils.isEmpty(user.getUserHeadImage())){
            return ServerResponse.response(UserInfoStatus.HEAD_IMAGE_EMPTY);
        }
        ServerResponse serverResponse = updateUserInfo(user);
        return serverResponse;
    }
}
